// Copyright 2022 Google LLC
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

#ifndef SkAlignedStorage_DEFINED
#define SkAlignedStorage_DEFINED

#include <cstddef>
#include <iterator>

template <int N, typename T> class SkAlignedSTStorage {
public:
    SkAlignedSTStorage() {}
    SkAlignedSTStorage(SkAlignedSTStorage &&) = delete;
    SkAlignedSTStorage(const SkAlignedSTStorage &) = delete;
    SkAlignedSTStorage &operator = (SkAlignedSTStorage &&) = delete;
    SkAlignedSTStorage &operator = (const SkAlignedSTStorage &) = delete;

    // Returns void* because this object does not initialize the
    // memory. Use placement new for types that require a constructor.
    void *get()
    {
        return fStorage;
    }
    const void *get() const
    {
        return fStorage;
    }

    // Act as a container of bytes because the storage is uninitialized.
    std::byte *data()
    {
        return fStorage;
    }
    const std::byte *data() const
    {
        return fStorage;
    }
    size_t size() const
    {
        return std::size(fStorage);
    }

private:
    alignas(T)std::byte fStorage[sizeof(T) * N];
};

#endif // SkAlignedStorage_DEFINED
